SpringBoot项目使用CXF框架开发Soap通信接口

您所在的位置:网站首页 springboot soap开发 SpringBoot项目使用CXF框架开发Soap通信接口

SpringBoot项目使用CXF框架开发Soap通信接口

2024-07-04 11:41| 来源: 网络整理| 查看: 265

SpringBoot项目使用CXF框架开发Soap通信接口

物料准备:

1.引入cxf官方提供的SpringBootStarter依赖

2.定义需要暴雷给外部调用的java接口以及接口的实现类

3.配置CxfConfig类,把你定义的java接口注册为webservice的Endpoint

引入cxf-spring-boot-starter-jaxws依赖

这里因为我用的springboot版本是2.4.2的,所以这里选择引入的是3.2.4版本的cxf框架,不建议引入更高的版本。

org.apache.cxf cxf-spring-boot-starter-jaxws 3.2.4 定义需要暴雷给外部调用的java接口以及接口的实现类 接口类 package cn.ath.knowwikibackend.cxf; import cn.ath.knowwikibackend.cxf.bean.UserInfo; import javax.jws.WebMethod; import javax.jws.WebParam; import javax.jws.WebService; import java.util.List; //声明这个接口是一个WebService接口,必须指定targetNamespace命名空间 @WebService(targetNamespace = "http://cxf.knowwikibackend.ath.cn/") public interface UserService { //WebMethod注解配置的是接口的方法名 //如果方法有参数,必须配置WebParam注解里的name参数名和targetNamespace命名空间 @WebMethod(operationName = "getHello") String getHello(@WebParam(name = "name",targetNamespace = "http://cxf.knowwikibackend.ath.cn/") String name); @WebMethod(operationName = "get123") List get123(); @WebMethod(operationName = "getUserInfo") UserInfo getUserInfo(); @WebMethod(operationName = "getUserList") List getUserList(); @WebMethod(operationName = "execTest1") void execTest1(); @WebMethod(operationName = "execTest2") void execTest2(@WebParam(name = "action",targetNamespace = "http://cxf.knowwikibackend.ath.cn/") String action); } 实现类 package cn.ath.knowwikibackend.cxf; import cn.ath.knowwikibackend.cxf.bean.UserInfo; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import java.util.ArrayList; import java.util.List; @Slf4j @Service public class UserServiceImpl implements UserService{ @Override public String getHello(String name) { return "hello "+name; } @Override public List get123() { List aee = new ArrayList(); aee.add("wer21r"); aee.add("regft23tf"); aee.add("retg23t"); return aee; } @Override public UserInfo getUserInfo() { UserInfo userInfo = new UserInfo(); userInfo.setAge(24); userInfo.setName("tear23ewr"); userInfo.setUid(10003L); return userInfo; } @Override public List getUserList() { List list = new ArrayList(); UserInfo userInfo = new UserInfo(); userInfo.setAge(24); userInfo.setName("tear23ewr"); userInfo.setUid(10003L); list.add(userInfo); UserInfo user2 = new UserInfo(); user2.setAge(27); user2.setName("grfw34tgf"); user2.setUid(10002L); list.add(user2); return list; } @Override public void execTest1() { log.info("execTest1 is exec ok !"); } @Override public void execTest2(String action) { log.info("action:{} is exec ok !",action); } } 配置CxfConfig类 package cn.ath.knowwikibackend.cxf; import org.apache.cxf.Bus; import org.apache.cxf.jaxws.EndpointImpl; import org.apache.cxf.transport.servlet.CXFServlet; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.web.servlet.ServletRegistrationBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import javax.xml.ws.Endpoint; @Configuration public class CxfConfig { @Autowired private Bus bus; @Autowired private UserService userService; @Bean public ServletRegistrationBean servletRegistrationBean(){ return new ServletRegistrationBean( new CXFServlet(), "/soap/*" ); } @Bean public Endpoint userEndpoint(){ EndpointImpl endpoint = new EndpointImpl(bus,userService); endpoint.publish("/user"); return endpoint; } } 测试访问webService效果 浏览器访问暴露出的soap接口

查看你的springboot项目暴露出的soap 接口清单,可以用浏览器访问

http://ip:port/webContext/soap/

webContext是你的项目的 server.servlet.context-path

/soap/ 是你在CxfConfig里配置的soap 接口的前缀

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

直接用浏览器访问

http://ip:port/webContext/soap/user?wsdl

也可以看到 user端点(Endpoint)的wsdl信息,如上图所示。

这个URL里的/user 是你在CxfConfig里配置的soap接口的Endpoint端点

使用hutool里提供的SoapClient调用这些soap接口 import cn.hutool.core.lang.Console; import cn.hutool.http.webservice.SoapClient; @Test void test23607(){ SoapClient client1 = SoapClient.create("http://localhost:8080/kwb/soap/user?wsdl"); // soap xml请求报文 --- 请求 getHello方法 Console.log(client1.setMethod("web:getHello","http://cxf.knowwikibackend.ath.cn/") .setParam("name","zhangsan") .getMsgStr(true)); //soap xml响应报文 Console.log(client1.send(true)); //重置 SoapClient client1.reset(); // soap xml请求报文 --- 请求 get123方法 Console.log(client1.setMethod("web:get123","http://cxf.knowwikibackend.ath.cn/") .getMsgStr(true)); //soap xml响应报文 Console.log(client1.send(true)); //重置 SoapClient client1.reset(); Console.log(client1.setMethod("web:getUserInfo","http://cxf.knowwikibackend.ath.cn/") .getMsgStr(true)); Console.log(client1.send(true)); client1.reset(); Console.log(client1.setMethod("web:getUserList","http://cxf.knowwikibackend.ath.cn/") .getMsgStr(true)); Console.log(client1.send(true)); client1.reset(); Console.log(client1.setMethod("web:execTest1","http://cxf.knowwikibackend.ath.cn/") .getMsgStr(true)); Console.log(client1.send(true)); }

soap接口通信的xml日志如下

zhangsan hello zhangsan wer21r regft23tf retg23t 24 tear23ewr 10003 24 tear23ewr 10003 27 grfw34tgf 10002 使用Postman测试工具来测试soap接口

在这里插入图片描述

使用cxf自带的工具请求webservice接口 @Test void test232323(){ String address = "http://localhost:8080/kwb/soap/user?wsdl"; JaxWsProxyFactoryBean jaxWsProxyFactoryBean = new JaxWsProxyFactoryBean(); jaxWsProxyFactoryBean.setAddress(address); jaxWsProxyFactoryBean.setServiceClass(UserService.class); UserService userService = (UserService) jaxWsProxyFactoryBean.create(); String name = "lisi"; String res = userService.getHello(name); System.err.println(res); List userList = userService.getUserList(); System.err.println(userList); userService.execTest1(); userService.execTest2("bak-sql"); }

执行效果如下

消费者端打印日志 hello lisi [UserInfo(uid=10003, name=tear23ewr, age=24), UserInfo(uid=10002, name=grfw34tgf, age=27)] //生产者端打印日志 2023-06-07 19:53:21,038 INFO [http-nio-8080-exec-1] [] c.a.k.c.UserServiceImpl [UserServiceImpl.java : 14] getHello--req name:lisi 2023-06-07 19:53:21,182 INFO [http-nio-8080-exec-2] [] c.a.k.c.UserServiceImpl [UserServiceImpl.java : 39] 访问了getUserList方法 2023-06-07 19:54:01,253 INFO [http-nio-8080-exec-4] [] c.a.k.c.UserServiceImpl [UserServiceImpl.java : 57] execTest1 is exec ok ! 2023-06-07 19:54:01,264 INFO [http-nio-8080-exec-5] [] c.a.k.c.UserServiceImpl [UserServiceImpl.java : 63] action:bak-sql is exec ok !


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3